CNN要求输入size固定,作者提出SPP layer,去除了CNN这一限制。
介绍
CNN处理图像时,输入图像的size往往固定(例如224x224);对于一些图像,缩放操作改变了物体的长宽比,影响了识别率。这篇文章中,提出了“spatial pyramid pooling”,去掉了对输入图像size固定的限制;因为pyramid pooling对图像形状有很好的鲁棒性,因此可以提高识别率。作者提出的新的网络结构叫做SPP-net。
CNN对输入图像size固定的限制是技术问题。输入图像size固定时,对图像处理通过crop或wrap,crop的区域可能不包含物体,wrap的图像可能改变了物体的形状。如下图所示
CNN为什么对输入图像size有要求呢?CNN有conv和fully-connected组成(pool也属于conv);conv是通过滑动窗口得到feature map,conv对输入size没有要求;fully-connected layer对输入size有固定要求。 通过在最后一个conv和fully-connected layer之间添加一个spp layer,spp layer池化最后一个conv输出的feature map,得到固定大小的feature,再喂给fully-connected layer。也就是说,在高层特征中,将信息进行了聚合,避免了对输入固定size的限制,如下图所示:
Spp全称为Spatial pyramid pooling,有以下特性:1、spp可以生成固定长度输出,2、spp可以多尺度空间特征,对形变物体有鲁棒性,3、spp可以在不同尺度pool特征。
SPP-net可以对任意size图像生成固定size的表示,还可以在训练时输入任意size图像,有助于增加缩放不变性和减小over-fitting。训练时具体做法为:把这个网络看做多个共享参数的网络,在一个epoch,输入的图像size大小固定,在下个epoch,切换输入size;multi-size training和传统single-size training收敛同,但是可以提高测试准确率。
SPP的优点适用于特定的CNN设计,例如AlexNet、VGG,尽管这些网络结构各不相同。
在R-CNN上,SPP-net有很大优势。R-CNN要计算每个candidate window的特征,因为candidate window太多,这些计算区域有重叠,计算量很大。使用SPP-net可以只计算图像特征一次,再根据candidate window,从feature map中选择对应区域特征即可。基于SPP-net的系统,与R-CNN对比,有24-102倍的加速。
CNN结构通常是CONV + POOL + Fully-connected,只有最后面的fully-connected要求输入size固定,因此可以在最后一个CONV/Pool和fully-connected之间加上一个spp layer。
SPP Layer
上图中就是在CONV和fully-connected layer之间加上spp layer。通过对feature map的spatial bins做不同尺度的pooling,得到固定size的输出。因为输入图像的size不影响spatial bin的数量,因此spp-layer可以得到固定size的输出。
在每一个spatial bin中,通过pooling每一个filter的response得到输出。例如有M个bin,k个filter,那么输出维度为kM。
训练
理论上来说,可以使用反向传播算法来训练spp-net,实际中还要考虑GPU实现因素。
Single-size training
先考虑固定size输入的训练。最后一个conv输出的size为$a \times a$,pyramid level 为$n \times n$。可是通过一个滑动窗口实现spp layer,$win=\lceil{a/n}\rceil$,$stride = \lfloor{a/n}\rfloor$。下图就是一个3-level pyramid pooling(3x3, 2x2, 1x1)的一个配置
spp-layer输入为13x13,size$X$表示滑动窗口的大小。
Multi-size training
输入使用不同size训练时,先预定义输入size的集合,像上面一样计算好不同size输入时,spp-layer参数设置。在一个epoch训练输入size1,下一个epoch训练输入size2。
SPP-net for Object Detection
R-CNN重复计算了重叠的candidate window,效率低下。可以计算整幅图像的feature map, 在把candidate window对应的feature map找到,把特定区域的feature map输入到spp-layer,可以得到固定size输出,如下图所示: